'''
    多元线性回归
    数据集来自：http://archive.ics.uci.edu/ml/machine-learning-databases/00294/
'''

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split,cross_val_predict
from sklearn.linear_model import LinearRegression
from sklearn import metrics

# 读取数据 一共有9568个样本 每个样本有5列
data=pd.read_csv('1-2.csv')
#print(data)
x=np.array(data[['AT','V','AP','RH']])
y=np.array(data[['PE']])

# 划分数据集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25,random_state=1)

# 模型的拟合
linreg=LinearRegression()
linreg.fit(x_train,y_train)
# 即为参数b
print(linreg.intercept_)
# 即为参数w1 w2...wn 也就是每个参数对应的权重
print(linreg.coef_)

# 模型评价
y_pred=linreg.predict(x_test)
# 可以改变使用不同的样本特征训练，查看MSE和RMSE，值越小说明拟合得越好
print("MSE:",metrics.mean_squared_error(y_test,y_pred))
print("RMSE:",np.sqrt(metrics.mean_squared_error(y_test,y_pred)))

#　使用10折交叉验证法来持续化优化模型
predicted=cross_val_predict(linreg,x,y,cv=10)
print("MSE:",metrics.mean_squared_error(y,predicted))
print("RMSE:",np.sqrt(metrics.mean_squared_error(y,predicted)))

# 画图 真实值与预测值的关系图
plt.scatter(y, predicted)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
plt.xlabel('Measured')
plt.ylabel('Predicted')
plt.show()
